#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <map>
#include <queue>
#include <list>

#define sf(x) scanf("%d", &x)
#define pf(x) printf("%d", x)
#define pf2(x,y) printf("%d %d ", x,y)
#define sf2(x,y) scanf("%d %d", &x,&y)
#define sff(x) scanf("%lf", &x)
#define pff(x) printf("%lf ", x)
#define ENDL printf("\n")
#define pfl(x) printf("%I64d ", x)
#define sfl(x) scanf("%I64d", &x)

using namespace std;

typedef long long ll;

bool a[37][1001];
bool flags[37];
int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	
	int n, m, q;
	scanf("%d%d%d", &n,&m,&q);
	string s, b;
	bool flag;
	int o;
	while (n!=0 || m!=0 || q!=0)
	{
		/*
		if (q==0)
		{
			if (m!=1 || n!=1)
			{
				for (int i=0 ; i< m; i++)
				{
					printf("?");
				}
			}
			else
			{
				printf("0");
			}
		}
		*/
		for (int i=0;i<q;i++)
		{
			cin>>s>>b;
			for (int j = 0; j< n;j++)
			{
				if (s[j] == '1')
				{
					flags[j] = !flags[j];
				}
				if (flags[j])
				{
					for (int k = 0; k< m; k++)
					{
						if (b[k] == '0') a[j][k] =1;
					}
				}
				else
				{
					for (int k = 0; k< m; k++)
					{
						if (b[k] == '1') a[j][k] =1;
					}
				}
			}
		}

		for (int i=0; i<m; i++)
		{
			flag = false;
			for (int k = 0; k<n; k++)
			{
				if (flag && a[k][i] == 0) 
				{
					flag = false;
					break;
				}
				if (a[k][i]==0)
				{
					flag = true;
					o = k;
				}
			}
			if (!flag) printf("?");
			else
			{
				if (o>9) 
				{
					printf("%c", o-10+'A');
				}else
				{
					pf(o);
				}
			}
		}
		ENDL;

		for(int i=0; i<36; i++)
		{
			memset(a[i],0,sizeof(a[i]));
		}
		memset(flags,0,sizeof(flags));
		scanf("%d%d%d", &n,&m,&q);
	}

	return 0;
}


